/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package jcac_1_0.m;

import java.util.List;
import java.util.Vector;
import jcac_1_0.util.AppConf;
import jcac_1_0.util.DbPagingInfo;
import jcac_1_0.util.DbUtil;

/**
 * 基础模型
 *
 * @author SoChishun
 * @version 1.0 2016-5-18
 */
public class BaseModels {

    protected String tableName;

    public BaseModels(String pstr_tableName) {
        this.tableName = pstr_tableName;
    }

    public Object getField(String field, String where) {
        if (null != where && where.length() > 0) {
            where = " where " + where;
        }
        return DbUtil.getStringResult(String.format("select %s from %s %s limit 1;", field, this.tableName, where));
    }

    // 2016-1-20
    public boolean setField(String field2values, String where) {
        if (null != where && where.length() > 0) {
            where = " where " + where;
        }
        String statement = String.format("update %s set %s %s;", this.tableName, field2values, where);
        return DbUtil.executeUpdate(statement) > 0;
    }

    /**
     * 传入的sql语句只能够获取一个字符串结果的sql，第一个字段必须是String类型，其他的会被忽略。<br>
     * 此方法只能用于返回要查询的结果既不为null也不是空字符串的情况。
     * @param statement
     * @return 
     */
    public String getStringResult(String statement) {
        return DbUtil.getStringResult(statement);
    }

    /**
     * 传入的sql语句只能够是count(*) 或者sum(字段)或者max(字段)，只能够查询整数的sql。
     * @param statement
     * @return 
     */
    public int executeCount(String statement) {
        return DbUtil.getCount(statement);
    }

    /**
     * 返回结果集Vector。线程安全的。Vector中包含的是HashTable。HashTable的key就sql语句中的字段名的小写。
     * @param fields
     * @param where
     * @return 
     */
    public Vector executeQueryVector(String fields, String where) {
        if (null != where && where.length() > 0) {
            where = " where " + where;
        }
        return DbUtil.executeQueryVector(String.format("select %s from %s %s limit 1;", fields, this.tableName, where));
    }

    /**
     * 执行一条记录并返回受影响的行数
     * @param statement
     * @return 
     */
    public int executeUpdate(String statement) {
        return DbUtil.executeUpdate(statement);
    }

    /**
     * 启用事务批量执行Sql并返回受影响的行数
     * @param statements 
     */
    public void executeBatch(List<String> statements) {
        DbUtil.executeBatch(statements);
    }

    /**
     * 写入一条记录并返回该记录主键值
     * @param statement
     * @return 
     */
    public int executeInsert(String statement) {
        return DbUtil.executeInsert(statement);
    }
    
    /**
     * 返回结果集List。 list中包含的是String[]数组。 她不像List中包含HashMap，直接保存的就是结果没有key。
     * @param statement
     * @return 
     */
    public List executeQueryStringList(String statement){
        return DbUtil.executeQueryStringList(statement);
    }
    /**
     * 返回结果集List。 list中包含的是hashmap。hashMap的key就sql语句中的字段名的小写。
     * @param where
     * @param field
     * @param order
     * @return 
     * version 1.0 2016-1-23
     */
    public List executeQueryList(String where, String field, String order) {
        if (null != where && where.length() > 0) {
            where = " where " + where;
        }
        if (null != order && order.length() > 0) {
            order = " order by " + order;
        }
        String statement = String.format("select %s from %s %s %s", field, this.tableName, where, order);
        return DbUtil.executeQueryList(statement);
    }

    /**
     * 返回结果集List。 list中包含的是hashmap。hashMap的key就sql语句中的字段名的小写。
     * @param statement
     * @return 
     */
    public List executeQueryList(String statement) {
        return DbUtil.executeQueryList(statement);
    }

    /**
     * 分页查询
     * @param pagingInfo
     * @param tableName
     * @param where
     * @param fields
     * @param order
     * @return 
     * @version 1.0 2016-5-19
     */
    public List executePaging(DbPagingInfo pagingInfo, String tableName, String where, String fields, String order) {
        if (pagingInfo.pageSize < 1) {
            pagingInfo.pageSize = AppConf.pageSize;
        }
        if (pagingInfo.pageID < 1) {
            pagingInfo.pageID = 1;
        }
        if (null == tableName || tableName.length() < 1) {
            tableName = this.tableName;
        }
        return DbUtil.executePagingList(pagingInfo, tableName, fields, where, order);
    }

    /**
     * 删除记录
     * @param id
     * @return 
     */
    public int delete(int id) {
        return DbUtil.executeUpdate(String.format("delete from %s where id=%d", this.tableName, id));
    }

    /**
     * 删除记录
     * @param where
     * @return 
     */
    public int delete(String where) {
        return DbUtil.executeUpdate(String.format("delete from %s where %s", this.tableName, where));
    }
}
